package tech.edwardvan.designpattern.pattern.behavioral.strategy;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * 策略模式
 * <p>
 * 举例:
 * {@link org.springframework.beans.factory.support.InstantiationStrategy}
 *
 * @author EdwardVan
 */
@Slf4j
public class StrategyDemo {

    public static void main(String[] args) {
        //未使用策略模式获取id
        IdGenerator idGenerator = new IdGenerator();
        idGenerator.setIdType("ObjectId");
        String id = idGenerator.generate();
        log.info("生成的id为:{}", id);
    }

    /**
     * id生成器
     */
    private static class IdGenerator {
        @Setter
        private String idType;

        public String generate() {
            if (StrUtil.isBlank(idType)) {
                log.error("id类型不能为空");
                return null;
            }
            //缺点:
            //1.如果想拓展类型,只能添加if...else...
            //2.不同策略之间高度耦合
            if ("UUID".equalsIgnoreCase(idType)) {
                //复杂的执行过程
                return IdUtil.randomUUID();
            } else if ("ObjectId".equalsIgnoreCase(idType)) {
                //复杂的执行过程
                return IdUtil.objectId();
            } else {
                log.error("id类型不支持");
                return null;
            }
        }
    }
}
